from coommon import *

class Relu:
    def __init__(self):
        """
        初始化ReLU激活函数类
        初始化一个mask变量，用于在forward过程中记录负值的位置
        """
        self.mask = None

    def forward(self, x):
        """
        ReLU激活函数的前向传播过程
        参数:
            x: 输入数据，可以是numpy数组
        返回:
            out: 经过ReLU激活后的输出
        """
        # 创建一个mask，标记所有小于等于0的元素位置
        self.mask = (x <= 0)
        # 复制输入数据
        out = x.copy()
        # 将所有小于等于0的元素置为0
        out[self.mask] = 0

        return out

    def backward(self, dout):
        """
        ReLU激活函数的反向传播过程
        参数:
            dout: 上一层的梯度
        返回:
            dx: 传递到当前层的梯度
        """
        # 将mask中为True的位置的梯度置为0
        dout[self.mask] = 0
        # 梯度直接传递
        dx = dout

        return dx

class Sigmoid:
    def __init__(self):
        self.out = None
    def forWard(self,x):
        y = sigmoid(x)
        self.out = y

        return out

    def backWard(self,dout):
        dx = dout * self.out * (1 - self.out)
        return dx

class Affine:
    def __init__(self,W,b):
        self.W = W
        self.b = b
        self.x = None
        self.orignal_x_shape = None
        self.dW = None
        self.db = None

    def forward(self,x):
        self.orignal_x_shape = x.shape
        self.x = x.reshape(x.shape[0],-1)
        out = np.dot(x,self.W) + self.b
        return out

    def backward(self,dout):
        dx = np.dot(dout,self.W.T)
        self.dW = np.dot(self.x.T,dout)
        self.db = np.sum(dout,axis=0)

        return dx